import logging
from logging.handlers import RotatingFileHandler

from flask import Flask
from flask_sqlalchemy import SQLAlchemy  #数据库配置第一步，导入相关包
from redis import StrictRedis
from flask_session import Session
from flask_wtf.csrf import CSRFProtect
from config import config_dict


#定义redis_store变量
redis_store=None
# db=None
db=SQLAlchemy() ##分成两句话来写的第一句话

#定义工厂方法
def create_app(config_name):

    app=Flask(__name__)

    #根据传入的配置类名称，取出对应的配置类
    config=config_dict.get(config_name)
    app.config.from_object(config)

    # 调用日志方法，记录程序运行情况
    log_file(config.LEVEL_NAME)

    #数据库配置第二步，创建SQLAlchemy对象，关联app
    # global db
    # db=SQLAlchemy(app) #要把这句话分成两句话来写
    db.init_app(app) #分成两句话来写的第二句话

    #创建redis对象(配置信息存放到Config里方便使用)
    global redis_store #global将局部变量升级为全局变量
    redis_store=StrictRedis(host=config.REDIS_HOST,port=config.REDIS_PORT,decode_responses=True)

    #创建session对象，读取app中session配置信息
    Session(app)

    #使用CSRFProtect保护app
    CSRFProtect(app)

    #将首页蓝图注册到app中
    from info.modules.index import index_blue #这句代码写到这里是为了避免循环导包
    app.register_blueprint(index_blue)

    #将认证蓝图passport_blue，注册到app中
    from info.modules.passport import passport_blue
    app.register_blueprint(passport_blue)

    print(app.url_map)
    return app


def log_file(LEVEL_NAME):
    #设置日志的记录等级
    logging.basicConfig(level=LEVEL_NAME)
    #创建日志记录器，指明日志保存的路径，每个日志文件的最大大小，保存的日志文件个数上线
    file_log_hander=RotatingFileHandler("logs/log",maxBytes=1024*1024*100,backupCount=10)
    #创建日志记录的格式，日志等级，输入日志信息的文件名，行数，日志信息
    formatter=logging.Formatter("%(levelname)s %(filename)s:%(lineno)d%(message)s")
    #为刚创建的日志记录器设置日志记录格式
    file_log_hander.setFormatter(formatter)
    #为全局的日志工具对象（flask app使用的）添加日志记录器
    logging.getLogger().addHandler(file_log_hander)